package com.zjsru.plan2024.oneday;

import java.util.ArrayDeque;
import java.util.Deque;
import java.util.LinkedList;

/**
 * 用栈实现队列
 * void push(int x) 将元素 x 推到队列的末尾
 * int pop() 从队列的开头移除并返回元素
 * int peek() 返回队列开头的元素
 * boolean empty() 如果队列为空，返回 true ；否则，返回 false
 * \
 * @Author: cookLee
 * @Date: 2024-03-04
 */
public class MyQueue {

    Deque<Integer> inStack;
    Deque<Integer> outStack;

    public MyQueue() {
        this.inStack = new ArrayDeque<>();
        this.outStack = new LinkedList<>();
    }

    /**
     * 入栈
     *
     * @param x x
     */
    public void push(int x) {
        this.inStack.push(x);
    }

    /**
     * 弹出数据
     *
     * @return int
     */
    public int pop() {
        //出栈为空则将输入栈的全部数据依次弹出并压入输出栈，这样输出栈从栈顶往栈底的顺序就是队列从队首往队尾的顺序。
        if(this.outStack.isEmpty()){
            this.helper();
        }
        return this.outStack.pop();
    }

    /**
     * 查看，与pop（）同理
     *
     * @return int
     */
    public int peek() {
        if(this.outStack.isEmpty()){
            this.helper();
        }
        return this.outStack.peek();
    }

    /**
     * 是否为空
     *
     * @return boolean
     */
    public boolean empty() {
        return this.inStack.isEmpty() && this.outStack.isEmpty();
    }

    /**
     * 栈数据转移帮手
     */
    private void helper() {
        while(!this.inStack.isEmpty()){
            this.outStack.push(this.inStack.pop());
        }
    }


}
